package zcw.com.lib_leet_code;

import zcw.com.lib_leet_code.util.Util;

/**
 * Created by 朱城委 on 2021/11/24.<br><br>
 *
 * 中等：矩阵置零
 */
public class Topic73 {

    public static void main(String[] args) {
        Topic73 instance = new Topic73();
        int[][] array;

        array = new int[][] {
                {1, 1, 1},
                {1, 0, 1},
                {1, 1, 1}
        };
        instance.setZeroes(array);
        Util.printArray(array);
    }

    public void setZeroes(int[][] matrix) {
        int row = matrix.length;
        int col = matrix[0].length;

        boolean flagCol0 = false;

        for(int i = 0; i < row; i++) {
            if(matrix[i][0] == 0) {
                flagCol0 = true;
            }

            for(int j = 1; j < col; j++) {
                if(matrix[i][j] == 0) {
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
            }
        }

        for(int i = row - 1; i >= 0; i--) {
            for(int j = 1; j < col; j++) {
                if(matrix[i][0] ==0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }

        if(flagCol0) {
            for(int i = 0; i < row; i++) {
                matrix[i][0] = 0;
            }
        }
    }

    public void setZeroes4(int[][] matrix) {
        int row = matrix.length;
        int col = matrix[0].length;

        boolean flagRow0 = false;
        boolean flagCol0 = false;

        for(int i = 0; i < col; i++) {
            if(matrix[0][i] == 0) {
                flagRow0 = true;
            }
        }

        for(int i = 0; i < row; i++) {
            if(matrix[i][0] == 0) {
                flagCol0 = true;
            }
        }

        for(int i = 1; i < row; i++) {
            for(int j = 1; j < col; j++) {
                if(matrix[i][j] == 0) {
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
            }
        }

        for(int i = 1; i < row; i++) {
            for(int j = 1; j < col; j++) {
                if(matrix[i][0] ==0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }

        if(flagRow0) {
            for(int i = 0; i < col; i++) {
                matrix[0][i] = 0;
            }
        }

        if(flagCol0) {
            for(int i = 0; i < row; i++) {
                matrix[i][0] = 0;
            }
        }
    }

    public void setZeroes3(int[][] matrix) {
        int row = matrix.length;
        int col = matrix[0].length;

        boolean[] rowBool = new boolean[row];
        boolean[] colBool = new boolean[col];

        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                if(matrix[i][j] == 0) {
                    rowBool[i] = true;
                    colBool[j] = true;
                }
            }
        }

        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                if(rowBool[i] || colBool[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }

    public void setZeroes2(int[][] matrix) {
        int row = matrix.length;
        int col = matrix[0].length;

        int[][] temp = new int[row][col];
        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                temp[i][j] = matrix[i][j];
            }
        }

        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                if(temp[i][j] == 0) {
                    helper(matrix, i, j);
                }
            }
        }
    }

    private void helper(int[][] matrix, int row, int col) {
        int rows = matrix.length;
        int cols = matrix[0].length;

        for(int i = 0; i < rows; i++) {
            matrix[i][col] = 0;
        }

        for(int i = 0; i < cols; i++) {
            matrix[row][i]= 0;
        }
    }
}
